home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / search / lsmtool-.6 / lsmtool- / lsmtool-0.6 / cnvt-2-to-3.c < prev    next >
C/C++ Source or Header  |  1994-11-11  |  4KB  |  187 lines

  1. /*
  2.  * cnvt-2-to-3.c -- convert a version 2 database to a version 3 database
  3.  *
  4.  * Lars Wirzenius
  5.  * "@(#)lsmtool:cnvt-2-to-3.c,v 1.3 1994/11/11 19:13:22 wirzeniu Exp"
  6.  */
  7.  
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <publib.h>
  13. #include "lsm.h"
  14.  
  15.  
  16. /* The database and the current location in it */
  17. static struct lsm_database db;
  18.  
  19.  
  20. static void convert(struct lsm_entry *);
  21.  
  22.  
  23. int main(int argc, char **argv) {
  24.     size_t i;
  25.  
  26.     __set_liberror(__exit_on_error | __complain_on_error);
  27.     set_progname(argv[0], "lsmtool");
  28.  
  29.     if (lsm_read_database(stdin, &db) == -1)
  30.         errormsg(1, 0, "error in database");
  31.  
  32.     for (i = 0; i < db.nentries; ++i)
  33.         convert(&db.entries[i]);
  34.  
  35.     lsm_write_database(stdout, &db);
  36.  
  37.     return 0;
  38. }
  39.  
  40.  
  41.  
  42. static char *field(struct lsm_entry *e, const char *name) {
  43.     char *p;
  44.  
  45.     p = e->fields[lsm_field_to_index(name)];
  46.     if (p == NULL)
  47.         return "";
  48.     return p;
  49. }
  50.  
  51.  
  52. static void delete(struct lsm_entry *e, const char *name) {
  53.     size_t i;
  54.     i = lsm_field_to_index(name);
  55.     free(e->fields[i]);
  56.     e->fields[i] = NULL;
  57. }
  58.  
  59.  
  60. static void set(struct lsm_entry *e, const char *name, const char *val) {
  61.     size_t i;
  62.     i = lsm_field_to_index(name);
  63.     free(e->fields[i]);
  64.     e->fields[i] = xstrdup(val);
  65. }
  66.  
  67.  
  68. static void siteconv(struct lsm_entry *e, const char *result, int n) {
  69.     char sitef[] = "SiteX";
  70.     char pathf[] = "PathX";
  71.     char filef[] = "FileX";
  72.     char sizef[] = "FileSizeX";
  73.     char *site, *path, *file, *size;
  74.     char buf[10240];
  75.     int siten, pathn, filen, sizen;
  76.  
  77.     *strchr(sitef, 'X') = n + '0';
  78.     *strchr(pathf, 'X') = n + '0';
  79.     *strchr(filef, 'X') = n + '0';
  80.     *strchr(sizef, 'X') = n + '0';
  81.  
  82.     site = field(e, sitef); siten = strcspn(site, "\n");
  83.     path = field(e, pathf); pathn = strcspn(path, "\n");
  84.     file = field(e, filef); filen = strcspn(file, "\n");
  85.     size = field(e, sizef); sizen = strcspn(size, "\n");
  86.  
  87.     if (*site == '\0' || *file == '\0') return;
  88.  
  89.     sprintf(buf, "%.*s %.*s\n\t\t%.*s %.*s\n",
  90.         siten, *site == '\0' ? "unknown" : site,
  91.         pathn, *path == '\0' ? "unknown" : path,
  92.         sizen, *size == '\0' ? "" : size,
  93.         filen, *file == '\0' ? "unknown" : file);
  94.  
  95.     set(e, result, buf);
  96. }
  97.  
  98.  
  99. static void append(struct lsm_entry *e, const char *to, const char *prefix) {
  100.     char f[100];
  101.     char buf[10240];
  102.     int i;
  103.  
  104.     strcpy(buf, field(e, to));
  105.     for (i = 0; i < 10; ++i) {
  106.         sprintf(f, "%s%d", prefix, i);
  107.         strcat(buf, field(e, f));
  108.         delete(e, f);
  109.     }
  110.     set(e, to, buf);
  111. }
  112.  
  113. static void convert(struct lsm_entry *e) {
  114.     char *p, buf[10240];
  115.  
  116.     if (strstr(field(e, "AuthorEmail"), "No address") == NULL) {
  117.         sprintf(buf, "%s (%s)", field(e, "AuthorEmail"),
  118.             field(e, "Author"));
  119.         strgsub(buf, "\n", "", sizeof(buf));
  120.         strcat(buf, "\n");
  121.         set(e, "Author", buf);
  122.     } else
  123.         delete(e, "Author");
  124.     delete(e, "AuthorEmail");
  125.  
  126.     if (strstr(field(e, "MaintEmail"), "No address") == NULL) {
  127.         sprintf(buf, "%s (%s)", field(e, "MaintEmail"),
  128.             field(e, "Maintainer"));
  129.         strgsub(buf, "\n", "", sizeof(buf));
  130.         strcat(buf, "\n");
  131.         set(e, "Maintained-by", buf);
  132.     }
  133.     delete(e, "MaintEmail");
  134.     delete(e, "Maintainer");
  135.  
  136.     append(e, "Description", "Comment");
  137.     append(e, "Description", "Required");
  138.  
  139.     if (field(e, "CopyPolicy1")[0] != '\0')
  140.         set(e, "Copying-policy", field(e, "CopyPolicy1"));
  141.     delete(e, "CopyPolicy1");
  142.     delete(e, "CopyPolicy2");
  143.     delete(e, "CopyPolicy3");
  144.     delete(e, "CopyPolicy4");
  145.  
  146.     siteconv(e, "Primary-site", 1);
  147.     siteconv(e, "Alternate-site", 2);
  148.     delete(e, "Site1");
  149.     delete(e, "Site2");
  150.     delete(e, "Site3");
  151.     delete(e, "Site4");
  152.     delete(e, "Path1");
  153.     delete(e, "Path2");
  154.     delete(e, "Path3");
  155.     delete(e, "Path4");
  156.     delete(e, "File1");
  157.     delete(e, "File2");
  158.     delete(e, "File3");
  159.     delete(e, "File4");
  160.     delete(e, "FileSize1");
  161.     delete(e, "FileSize2");
  162.     delete(e, "FileSize3");
  163.     delete(e, "FileSize4");
  164.  
  165.     p = field(e, "Entered");
  166.     if (*p != '\0')
  167.         set(e, "Entered-date", p);
  168.     delete(e, "Entered");
  169.  
  170.     delete(e, "EmailEntered");
  171.     delete(e, "RelFiles1");
  172.     delete(e, "RelFiles2");
  173.     delete(e, "RelFiles3");
  174.     delete(e, "RelFiles4");
  175.     delete(e, "EnteredBy");
  176.     delete(e, "CheckedEmail");
  177.  
  178.     if (field(e, "Title")[0] == '\0')
  179.         set(e, "Title", "?\n");
  180.     if (field(e, "Version")[0] == '\0')
  181.         set(e, "Version", "?\n");
  182.     if (field(e, "Primary-site")[0] == '\0')
  183.         set(e, "Primary-site", "?\n\t?\n");
  184.     if (field(e, "Description")[0] == '\0')
  185.         set(e, "Description", "?\n");
  186. }
  187.